package com.whmall.service.crm.api;

import com.whmall.service.crm.entity.dto.companyuser.*;

import java.util.List;
import java.util.Map;

/**
 * 公司用户平台API
 */
public interface CompanyUserPlatformApi {

    /**
     * 查询用户的有效平台ID（通用）
     * @param index 通知业务的位置索引
     * @param userIds
     * @param thirdPlatformType 三方平台类型
     * @return
     */
    List<String> listValidByUserIds(Integer index, List<Long> userIds, Integer thirdPlatformType);

    /**
     * 查询用户的有效平台ID（通用）
     * @param index 通知业务的位置索引
     * @param userIds 用户ID
     * @param thirdPlatformType 三方平台类型
     * @return 用户ID => 用户openID数组，可能不存在
     */
    Map<Long, List<String>> mapValidByUserIds(Integer index, List<Long> userIds, Integer thirdPlatformType);

    /**
     * 查询用户平台列表（通用）
     * @param reqDTO
     * @return
     */
    List<CompanyUserPlatformKeyFieldRspDTO> listBy(CompanyUserPlatformListByReqDTO reqDTO);

    /**
     * <p>判断用户是否绑定</p>
     * <li>绑定：存在且{is_bind}字段为1</li>
     *
     * @author qiao shengda
     * @since 2021/7/6
     * @param userId 用户ID
     * @param openId 平台ID
     * @param thirdPlatformType 三方类型
     * @return 结果
     * */
    Boolean isBinding(Long userId, String openId, Integer thirdPlatformType);

    /**
     * <p>根据用户ID查询 通知状态码</p>
     * <li>没有或0：表示用户开启通知</li>
     * <li>1：表示用户关闭通知</li>
     *
     * @param userId 用户ID
     * @param openId 平台ID
     * @param thirdPlatformType 三方类型
     * @return 通知状态码
     * @author qiao shengda
     * @since 2021/7/6
     * */
    String getSelectByUserId(Long userId, String openId, Integer thirdPlatformType);

    /**
     * 修改通知类型，只传取消的通知索引
     *
     * @param userId 用户ID
     * @param openId 平台ID
     * @param thirdPlatformType 三方类型
     * @param indexes 选中的数组
     * @return 操作结果
     * @author qiao shengda
     * @since 2021/7/6
     * */
    Integer select(Long userId, String openId, Integer thirdPlatformType, Map<Integer, Integer> indexes);

    /**
     * 用户关注时在该表中插入记录
     * @param reqDTO
     * @return
     */
    Long follow(CompanyUserPlatformSaveReqDTO reqDTO);

    /**
     * 用户取消关注
     * @param reqDTO
     * @return
     */
    void unfollow(CompanyUserPlatformUnFollowReqDTO reqDTO);

    /**
     * 保存access_token
     * @param reqDTO
     */
    AccessTokenSaveRspDTO saveAccessToken(AccessTokenSaveReqDTO reqDTO);

    /**
     * 公众号登录后 绑定用户
     * @param userId
     * @param openId
     */
    void bind(Long userId, String openId, Integer thirdPlatformType);

    /**
     * 公众号 解绑用户
     * @param userId
     * @param openId
     */
    void unBind(Long userId, String openId, Integer thirdPlatformType);

    /**
     * pc后台解绑 解绑该用户 所有微信
     * @param userId
     */
    void unBindForPc(Long userId, Integer thirdPlatformType);

}
